<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="utf-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        
        <meta name="author" content="隐星魂 (Roy.Sun)">
        
        <link rel="shortcut icon" href="../../img/favicon.ico">
        <title>移植笔记 - 玄武操作系统</title>
        <link href="../../css/bootstrap.min.css" rel="stylesheet">
        <link href="../../css/font-awesome.min.css" rel="stylesheet">
        <link href="../../css/base.css" rel="stylesheet">
        <link rel="stylesheet" href="https://cdn.staticfile.org/highlight.js/10.0.3/styles/color-brewer.min.css">

        <script src="../../js/jquery-1.10.2.min.js" defer></script>
        <script src="../../js/bootstrap.min.js" defer></script>
        <script src="https://cdn.staticfile.org/highlight.js/10.0.3/highlight.min.js"></script>
        <script>hljs.initHighlightingOnLoad();</script> 
    </head>

    <body>
        <div class="navbar fixed-top navbar-expand-lg navbar-dark bg-primary">
            <div class="container">
                <a class="navbar-brand" href="../..">玄武操作系统</a>
                <!-- Expander button -->
                <button type="button" class="navbar-toggler" data-toggle="collapse" data-target="#navbar-collapse">
                    <span class="navbar-toggler-icon"></span>
                </button>

                <!-- Expanded navigation -->
                <div id="navbar-collapse" class="navbar-collapse collapse">
                        <!-- Main navigation -->
                        <ul class="nav navbar-nav">
                            <li class="navitem">
                                <a href="../.." class="nav-link">主页</a>
                            </li>
                            <li class="navitem">
                                <a href="../../License/" class="nav-link">开源协议</a>
                            </li>
                            <li class="dropdown">
                                <a href="#" class="nav-link dropdown-toggle" data-toggle="dropdown">快速开发指南 <b class="caret"></b></a>
                                <ul class="dropdown-menu">
                                    
  <li class="dropdown-submenu">
    <a href="#" class="dropdown-item">STM32</a>
    <ul class="dropdown-menu">
            
<li>
    <a href="../../QuickGuide/stm32/01-Envsetup-Guide/" class="dropdown-item">01-开发环境搭建指南</a>
</li>
            
<li>
    <a href="../../QuickGuide/stm32/02-atkh743/" class="dropdown-item">02-正点原子阿波罗H743开发板上手指南</a>
</li>
            
<li>
    <a href="../../QuickGuide/stm32/03-fk429m/" class="dropdown-item">03-反客F429核心板上手指南</a>
</li>
            
<li>
    <a href="../../QuickGuide/stm32/04-atkf103core/" class="dropdown-item">04-正点原子F103核心板上手指南</a>
</li>
            
<li>
    <a href="../../QuickGuide/stm32/05-atkf407core/" class="dropdown-item">05-正点原子F407核心板上手指南</a>
</li>
            
<li>
    <a href="../../QuickGuide/stm32/06-WeActH750/" class="dropdown-item">06-微行电子H750开发板上手指南</a>
</li>
            
<li>
    <a href="../../QuickGuide/stm32/07-Project-From-Scratch-Guide/" class="dropdown-item">07-自定义工程配置指南</a>
</li>
    </ul>
  </li>
                                    
  <li class="dropdown-submenu">
    <a href="#" class="dropdown-item">GD32</a>
    <ul class="dropdown-menu">
            
<li>
    <a href="../../QuickGuide/gd32/01-Envsetup-Guide/" class="dropdown-item">01-开发环境搭建指南</a>
</li>
            
<li>
    <a href="../../QuickGuide/gd32/02-Project-Setup-Guide/" class="dropdown-item">02-工程配置指南</a>
</li>
    </ul>
  </li>
                                    
  <li class="dropdown-submenu">
    <a href="#" class="dropdown-item">GD32V</a>
    <ul class="dropdown-menu">
            
<li>
    <a href="../../QuickGuide/gd32v/01-Envsetup-Guide/" class="dropdown-item">01-开发环境搭建指南</a>
</li>
            
<li>
    <a href="../../QuickGuide/gd32v/02-Project-Setup-Guide/" class="dropdown-item">02-工程配置指南</a>
</li>
    </ul>
  </li>
                                    
  <li class="dropdown-submenu">
    <a href="#" class="dropdown-item">NXP S32K</a>
    <ul class="dropdown-menu">
            
<li>
    <a href="../../QuickGuide/s32k/01-Envsetup-Guide/" class="dropdown-item">01-开发环境搭建指南</a>
</li>
            
<li>
    <a href="../../QuickGuide/s32k/02-Project-Setup-Guide/" class="dropdown-item">02-工程配置指南</a>
</li>
    </ul>
  </li>
                                    
  <li class="dropdown-submenu">
    <a href="#" class="dropdown-item">玄武内核模块</a>
    <ul class="dropdown-menu">
            
<li>
    <a href="../../QuickGuide/xwko/01-XuanWuKO-Guide/" class="dropdown-item">01-上手指南</a>
</li>
    </ul>
  </li>
                                </ul>
                            </li>
                            <li class="dropdown">
                                <a href="#" class="nav-link dropdown-toggle" data-toggle="dropdown">应用手册 <b class="caret"></b></a>
                                <ul class="dropdown-menu">
                                    
<li>
    <a href="../../UserManual/00-Index/" class="dropdown-item">0.目录</a>
</li>
                                    
<li>
    <a href="../../UserManual/01-Brief/" class="dropdown-item">1.简介</a>
</li>
                                    
<li>
    <a href="../../UserManual/02-Basic-System-Architecture/" class="dropdown-item">2.系统基本架构</a>
</li>
                                    
<li>
    <a href="../../UserManual/03-Build-System/" class="dropdown-item">3.构建系统</a>
</li>
                                    
<li>
    <a href="../../UserManual/04-Boot-Flow/" class="dropdown-item">4.启动流程</a>
</li>
                                    
<li>
    <a href="../../UserManual/05-IRQ/" class="dropdown-item">5.中断控制</a>
</li>
                                    
<li>
    <a href="../../UserManual/06-SKD/" class="dropdown-item">6.调度器</a>
</li>
                                    
<li>
    <a href="../../UserManual/07-Thread/" class="dropdown-item">7.线程</a>
</li>
                                    
<li>
    <a href="../../UserManual/08-SWT/" class="dropdown-item">8.软件定时器</a>
</li>
                                    
<li>
    <a href="../../UserManual/09-PM/" class="dropdown-item">9.电源管理</a>
</li>
                                    
<li>
    <a href="../../UserManual/10-Lock/" class="dropdown-item">10.锁</a>
</li>
                                    
<li>
    <a href="../../UserManual/11-Sync/" class="dropdown-item">11.同步</a>
</li>
                                    
<li>
    <a href="../../UserManual/12-MM/" class="dropdown-item">12.内存管理</a>
</li>
                                    
<li>
    <a href="../../UserManual/13-C-Lib/" class="dropdown-item">13.玄武C库</a>
</li>
                                </ul>
                            </li>
                            <li class="dropdown">
                                <a href="#" class="nav-link dropdown-toggle" data-toggle="dropdown">Lua手册 <b class="caret"></b></a>
                                <ul class="dropdown-menu">
                                    
<li>
    <a href="../../LuaManual/00-Index/" class="dropdown-item">0.目录</a>
</li>
                                    
<li>
    <a href="../../LuaManual/01-Brief/" class="dropdown-item">1.简介</a>
</li>
                                    
<li>
    <a href="../../LuaManual/02-XWXT/" class="dropdown-item">2.全局导出表</a>
</li>
                                    
  <li class="dropdown-submenu">
    <a href="#" class="dropdown-item">3.XWOS内核</a>
    <ul class="dropdown-menu">
            
<li>
    <a href="../../LuaManual/03-XWOS/01-SDK/" class="dropdown-item">3.1.线程库</a>
</li>
            
<li>
    <a href="../../LuaManual/03-XWOS/02-Spinlock/" class="dropdown-item">3.2.自旋锁库</a>
</li>
            
<li>
    <a href="../../LuaManual/03-XWOS/03-Seqlock/" class="dropdown-item">3.3.顺序锁库</a>
</li>
            
<li>
    <a href="../../LuaManual/03-XWOS/04-Mutex/" class="dropdown-item">3.4.互斥锁库</a>
</li>
            
<li>
    <a href="../../LuaManual/03-XWOS/05-Semaphore/" class="dropdown-item">3.5.信号量库</a>
</li>
            
<li>
    <a href="../../LuaManual/03-XWOS/06-Condition/" class="dropdown-item">3.6.条件量库</a>
</li>
            
<li>
    <a href="../../LuaManual/03-XWOS/07-Flag/" class="dropdown-item">3.7.事件标志库</a>
</li>
            
<li>
    <a href="../../LuaManual/03-XWOS/08-Barrier/" class="dropdown-item">3.8.线程栅栏库</a>
</li>
            
<li>
    <a href="../../LuaManual/03-XWOS/09-Selector/" class="dropdown-item">3.9.信号选择器库</a>
</li>
            
<li>
    <a href="../../LuaManual/03-XWOS/10-PM/" class="dropdown-item">3.10.电源管理</a>
</li>
    </ul>
  </li>
                                    
  <li class="dropdown-submenu">
    <a href="#" class="dropdown-item">4.玄武Lua函数库</a>
    <ul class="dropdown-menu">
            
<li>
    <a href="../../LuaManual/04-XWLIB/01-Bitmap/" class="dropdown-item">4.1.位图</a>
</li>
    </ul>
  </li>
                                    
  <li class="dropdown-submenu">
    <a href="#" class="dropdown-item">5.设备栈</a>
    <ul class="dropdown-menu">
            
<li>
    <a href="../../LuaManual/05-XWDS/01-Soc/" class="dropdown-item">5.1.SOC</a>
</li>
            
<li>
    <a href="../../LuaManual/05-XWDS/02-GPIO/" class="dropdown-item">5.2.GPIO</a>
</li>
            
<li>
    <a href="../../LuaManual/05-XWDS/03-UART/" class="dropdown-item">5.3.UART</a>
</li>
            
<li>
    <a href="../../LuaManual/05-XWDS/04-SPI-Master/" class="dropdown-item">5.4.SPI Master</a>
</li>
            
<li>
    <a href="../../LuaManual/05-XWDS/05-IIC-Master/" class="dropdown-item">5.5.IIC Master</a>
</li>
    </ul>
  </li>
                                </ul>
                            </li>
                            <li class="dropdown active">
                                <a href="#" class="nav-link dropdown-toggle" data-toggle="dropdown">移植笔记 <b class="caret"></b></a>
                                <ul class="dropdown-menu">
                                    
<li>
    <a href="../00-Index/" class="dropdown-item">目录</a>
</li>
                                    
<li>
    <a href="./" class="dropdown-item active">移植笔记</a>
</li>
                                    
  <li class="dropdown-submenu">
    <a href="#" class="dropdown-item">ARM-Cortex-M</a>
    <ul class="dropdown-menu">
            
<li>
    <a href="../02-ARM-Cortex-M/01-ARM-Cortex-M-Porting-Note/" class="dropdown-item">架构移植笔记</a>
</li>
            
<li>
    <a href="../02-ARM-Cortex-M/02-STM32-Porting-Note/" class="dropdown-item">STM32</a>
</li>
    </ul>
  </li>
                                    
  <li class="dropdown-submenu">
    <a href="#" class="dropdown-item">RISC-V</a>
    <ul class="dropdown-menu">
            
<li>
    <a href="../03-RISC-V/01-GD32V-Porting-Note/" class="dropdown-item">GD32V</a>
</li>
    </ul>
  </li>
                                </ul>
                            </li>
                            <li class="dropdown">
                                <a href="#" class="nav-link dropdown-toggle" data-toggle="dropdown">规范 <b class="caret"></b></a>
                                <ul class="dropdown-menu">
                                    
<li>
    <a href="../../Specification/00-Index/" class="dropdown-item">目录</a>
</li>
                                    
<li>
    <a href="../../Specification/01-Git-Commit-Specification/" class="dropdown-item">git-commit规范</a>
</li>
                                    
<li>
    <a href="../../Specification/02-Version-Branch-Specification/" class="dropdown-item">版本分支规范</a>
</li>
                                </ul>
                            </li>
                        </ul>

                    <ul class="nav navbar-nav ml-auto">
                        <li class="nav-item">
                            <a href="#" class="nav-link" data-toggle="modal" data-target="#mkdocs_search_modal">
                                <i class="fa fa-search"></i> 搜索
                            </a>
                        </li>
                            <li class="nav-item">
                                <a rel="prev" href="../00-Index/" class="nav-link">
                                    <i class="fa fa-arrow-left"></i> 上一篇
                                </a>
                            </li>
                            <li class="nav-item">
                                <a rel="next" href="../02-ARM-Cortex-M/01-ARM-Cortex-M-Porting-Note/" class="nav-link">
                                    下一篇 <i class="fa fa-arrow-right"></i>
                                </a>
                            </li>
                    </ul>
                </div>
            </div>
        </div>

        <div class="container">
            <div class="row">
                    <div class="col-md-3"><div class="navbar-light navbar-expand-md bs-sidebar hidden-print affix" role="complementary">
    <div class="navbar-header">
        <button type="button" class="navbar-toggler collapsed" data-toggle="collapse" data-target="#toc-collapse" title="Table of Contents">
            <span class="fa fa-angle-down"></span>
        </button>
    </div>

    
    <div id="toc-collapse" class="navbar-collapse collapse card bg-secondary">
        <ul class="nav flex-column">
            
            <li class="nav-item" data-level="1"><a href="#_1" class="nav-link">移植说明</a>
              <ul class="nav flex-column">
              </ul>
            </li>
            
            <li class="nav-item" data-level="1"><a href="#1" class="nav-link">1.概述</a>
              <ul class="nav flex-column">
              </ul>
            </li>
            
            <li class="nav-item" data-level="1"><a href="#2osxwospl" class="nav-link">2.玄武OS移植层（XWOSPL）头文件规则</a>
              <ul class="nav flex-column">
              </ul>
            </li>
            
            <li class="nav-item" data-level="1"><a href="#3" class="nav-link">3.移植</a>
              <ul class="nav flex-column">
            <li class="nav-item" data-level="2"><a href="#31" class="nav-link">3.1.基本类型</a>
              <ul class="nav flex-column">
              </ul>
            </li>
            <li class="nav-item" data-level="2"><a href="#32" class="nav-link">3.2.编译器</a>
              <ul class="nav flex-column">
              </ul>
            </li>
            <li class="nav-item" data-level="2"><a href="#33" class="nav-link">3.3.断点</a>
              <ul class="nav flex-column">
              </ul>
            </li>
            <li class="nav-item" data-level="2"><a href="#34setjmp" class="nav-link">3.4.setjmp</a>
              <ul class="nav flex-column">
              </ul>
            </li>
            <li class="nav-item" data-level="2"><a href="#35" class="nav-link">3.5.系统调用与系统特权</a>
              <ul class="nav flex-column">
              </ul>
            </li>
            <li class="nav-item" data-level="2"><a href="#36" class="nav-link">3.6.位操作</a>
              <ul class="nav flex-column">
              </ul>
            </li>
            <li class="nav-item" data-level="2"><a href="#37" class="nav-link">3.7.原子操作</a>
              <ul class="nav flex-column">
              </ul>
            </li>
            <li class="nav-item" data-level="2"><a href="#38" class="nav-link">3.8.无锁队列</a>
              <ul class="nav flex-column">
              </ul>
            </li>
            <li class="nav-item" data-level="2"><a href="#39" class="nav-link">3.9.自旋锁</a>
              <ul class="nav flex-column">
              </ul>
            </li>
            <li class="nav-item" data-level="2"><a href="#310" class="nav-link">3.10.中断</a>
              <ul class="nav flex-column">
              </ul>
            </li>
            <li class="nav-item" data-level="2"><a href="#311" class="nav-link">3.11.硬件定时器</a>
              <ul class="nav flex-column">
              </ul>
            </li>
            <li class="nav-item" data-level="2"><a href="#312" class="nav-link">3.12.调度器</a>
              <ul class="nav flex-column">
              </ul>
            </li>
              </ul>
            </li>
            
            <li class="nav-item" data-level="1"><a href="#4" class="nav-link">4.链接脚本</a>
              <ul class="nav flex-column">
              </ul>
            </li>
            
            <li class="nav-item" data-level="1"><a href="#5" class="nav-link">5.初始化流程</a>
              <ul class="nav flex-column">
              </ul>
            </li>
            
            <li class="nav-item" data-level="1"><a href="#6" class="nav-link">6.编译集成环境</a>
              <ul class="nav flex-column">
            <li class="nav-item" data-level="2"><a href="#61" class="nav-link">6.1.使用玄武构建系统</a>
              <ul class="nav flex-column">
              </ul>
            </li>
            <li class="nav-item" data-level="2"><a href="#62ide" class="nav-link">6.2.使用其他IDE构建系统</a>
              <ul class="nav flex-column">
              </ul>
            </li>
              </ul>
            </li>
            
            <li class="nav-item" data-level="1"><a href="#7" class="nav-link">7.附录</a>
              <ul class="nav flex-column">
              </ul>
            </li>
        </ul>
    </div>
</div></div>
                    <div class="col-md-9" role="main">

<h1 id="_1">移植说明</h1>
<hr />
<h1 id="1">1.概述</h1>
<p>玄武OS的移植，包括以下几个环节：</p>
<ul>
<li>编译环境</li>
<li>初始化流程</li>
<li>玄武OS移植层（XWOSPL）</li>
<li>玄武OS移植实现层（XWOSIMPL）</li>
</ul>
<p>玄武OS采用<strong>适配器模式</strong>的方法来构建移植相关的代码：玄武OS移植层（XWOSPL）<strong>定义</strong>接口，
玄武OS移植实现层（XWOSIMPL）提供<strong>实现</strong>。</p>
<p>为了提高代码的复用性，玄武OS移植实现层（XWOSIMPL）相关的代码又细分为：</p>
<ul>
<li>架构描述层(ADL)</li>
<li>CPU描述层(CDL)</li>
<li>SOC描述层(SDL)</li>
<li>电路板描述层(BDL)</li>
</ul>
<p>例如，ARMv7m架构下，ADL目录为<code>xwcd/soc/arm/v7m/gcc/</code>，其中代码对
STM32、S32K、i.MX RT1052、GD32等都是复用的，m3、m4、m7的差异又由CDL目录来描述，
相同的CPU内核不同SOC又由SDL来描述，不同的电路板由BDL来描述，最后由他们共同完成
对编译环境、初始化流程以及玄武OS移植实现层（XWOSIMPL）的“<strong>实现</strong>”。</p>
<h1 id="2osxwospl">2.玄武OS移植层（XWOSPL）头文件规则</h1>
<ul>
<li><code>xwos/ospl/*.h</code>：玄武OS提供给BSP的头文件，不可被玄武OS自身的头文件包含。<ul>
<li>前缀<code>xwospl</code>：BSP中需要提供实现的函数</li>
<li>前缀<code>xwosplcb</code>：BSP中可以调用的函数</li>
</ul>
</li>
<li><code>xwos/ospl/soc/*.h</code>：BSP提供给玄武OS的头文件，可被玄武OS的头文件包含。<ul>
<li>前缀<code>soc</code>：BSP中额外提供结构体、函数等</li>
</ul>
</li>
</ul>
<h1 id="3">3.移植</h1>
<p>玄武OS的移植，包括：基本类型、编译器、断点、setjmp、系统调用与系统特权、
位操作、原子操作、无锁队列、自旋锁、中断、硬件定时器、调度器。</p>
<h2 id="31">3.1.基本类型</h2>
<p>玄武OS定义了自己的一套基本类型，所有源码都是围绕基本类型展开的。</p>
<ul>
<li>玄武OS头文件：<code>xwos/lib/type.h</code>，
    详见<a href="../../UserManual/02-Basic-System-Architecture/">系统基本架构</a>。</li>
<li>Adapter：<code>xwos/ospl/soc/type.h</code></li>
<li>Adaptee：<code>xwosimpl_soc_type.h</code>文件对某些类型按照架构的ELFABI规则重新进行了
    定义，并且需要将<code>ARCH_HAVE_xxxx</code>宏定义为1，表明覆盖<code>xxxx</code>的默认定义，
    此文件一般位于<strong>ADL</strong>目录，例如<code>xwcd/soc/arm/v7m/gcc/xwosimpl_soc_type.h</code>。</li>
<li>基本类型：<ul>
<li><code>ARCH_HAVE_XWU8_T</code>：宏，定义为1表示arch_type.h中提供类型xwu8_t</li>
<li><code>xwu8_t</code>：类型，8位无符号整数</li>
<li><code>ARCH_HAVE_XWU8_A</code>：宏，定义为1表示arch_type.h中提供类型xwu8_a</li>
<li><code>xwu8_a</code>：类型，原子的8位无符号整数</li>
<li><code>ARCH_HAVE_XWS8_T</code>：宏，定义为1表示arch_type.h中提供类型xws8_t</li>
<li><code>xws8_t</code>：类型，8位有符号整数</li>
<li><code>ARCH_HAVE_XWS8_A</code>：宏，定义为1表示arch_type.h中提供类型xws8_a</li>
<li><code>xws8_a</code>：类型，原子的8位有符号整数</li>
<li><code>ARCH_HAVE_XWU16_T</code>：宏，定义为1表示arch_type.h中提供类型xwu16_t</li>
<li><code>xwu16_t</code>：类型，16位无符号整数</li>
<li><code>ARCH_HAVE_XWU16_A</code>：宏，定义为1表示arch_type.h中提供类型xwu16_a</li>
<li><code>xwu16_a</code>：类型，原子的16位无符号整数</li>
<li><code>ARCH_HAVE_XWS16_T</code>：宏，定义为1表示arch_type.h中提供类型xws16_t</li>
<li><code>xws16_t</code>：类型，16位有符号整数</li>
<li><code>ARCH_HAVE_XWS16_A</code>：宏，定义为1表示arch_type.h中提供类型xws16_a</li>
<li><code>xws16_a</code>：类型，原子的16位有符号整数</li>
<li><code>ARCH_HAVE_XWU32_T</code>：宏，定义为1表示arch_type.h中提供类型xwu32_t</li>
<li><code>xwu32_t</code>：类型，32位无符号整数</li>
<li><code>ARCH_HAVE_XWU32_A</code>：宏，定义为1表示arch_type.h中提供类型xwu32_a</li>
<li><code>xwu32_a</code>：类型，原子的32位无符号整数</li>
<li><code>ARCH_HAVE_XWS32_T</code>：宏，定义为1表示arch_type.h中提供类型xws32_t</li>
<li><code>xws32_t</code>：类型，32位有符号整数</li>
<li><code>ARCH_HAVE_XWS32_A</code>：宏，定义为1表示arch_type.h中提供类型xws32_a</li>
<li><code>xws32_a</code>：类型，原子的32位有符号整数</li>
<li><code>ARCH_HAVE_XWU64_T</code>：宏，定义为1表示arch_type.h中提供类型xwu64_t</li>
<li><code>xwu64_t</code>：类型，64位无符号整数</li>
<li><code>ARCH_HAVE_XWU64_A</code>：宏，定义为1表示arch_type.h中提供类型xwu64_a</li>
<li><code>xwu64_a</code>：类型，原子的64位无符号整数</li>
<li><code>ARCH_HAVE_XWS64_T</code>：宏，定义为1表示arch_type.h中提供类型xws64_t</li>
<li><code>xws64_t</code>：类型，64位有符号整数</li>
<li><code>ARCH_HAVE_XWS64_A</code>：宏，定义为1表示arch_type.h中提供类型xws64_a</li>
<li><code>xws64_a</code>：类型，原子的64位有符号整数</li>
<li><code>ARCH_HAVE_XWSZ_T</code>：宏，定义为1表示arch_type.h中提供类型xwsz_t</li>
<li><code>xwsz_t</code>：类型，无符号大小值类型</li>
<li><code>ARCH_HAVE_XWSZ_A</code>：宏，定义为1表示arch_type.h中提供类型xwsz_a</li>
<li><code>xwsz_a</code>：类型，原子的无符号大小值类型</li>
<li><code>ARCH_HAVE_XWSSZ_T</code>：宏，定义为1表示arch_type.h中提供类型xwssz_t</li>
<li><code>xwssz_t</code>：类型，有符号大小值类型</li>
<li><code>ARCH_HAVE_XWSSZ_A</code>：宏，定义为1表示arch_type.h中提供类型xwssz_a</li>
<li><code>xwssz_a</code>：类型，原子的有符号大小值类型</li>
<li><code>ARCH_HAVE_XWSTK_T</code>：宏，定义为1表示arch_type.h中提供类型xwstk_t</li>
<li><code>xwstk_t</code>：类型，无符号栈类型</li>
<li><code>ARCH_HAVE_XWSTK_A</code>：宏，定义为1表示arch_type.h中提供类型xwstk_a</li>
<li><code>xwstk_a</code>：类型，原子的无符号栈类型</li>
<li><code>ARCH_HAVE_XWPTR_T</code>：宏，定义为1表示arch_type.h中提供类型xwptr_t</li>
<li><code>xwptr_t</code>：类型，无符号指针值类型</li>
<li><code>ARCH_HAVE_XWPTR_A</code>：宏，定义为1表示arch_type.h中提供类型xwptr_a</li>
<li><code>xwptr_a</code>：类型，原子的无符号指针值类型</li>
<li><code>ARCH_HAVE_XWREG_T</code>：宏，定义为1表示arch_type.h中提供类型xwreg_t</li>
<li><code>xwreg_t</code>：类型，无符号寄存器类型</li>
<li><code>ARCH_HAVE_XWREG_A</code>：宏，定义为1表示arch_type.h中提供类型xwreg_a</li>
<li><code>xwreg_a</code>：类型，原子的无符号寄存器类型</li>
<li><code>ARCH_HAVE_XWSREG_T</code>：宏，定义为1表示arch_type.h中提供类型xwsreg_t</li>
<li><code>xwsreg_t</code>：类型，有符号寄存器类型</li>
<li><code>ARCH_HAVE_XWSREG_A</code>：宏，定义为1表示arch_type.h中提供类型xwsreg_a</li>
<li><code>xwsreg_a</code>：类型，原子的有符号寄存器类型</li>
<li><code>ARCH_HAVE_XWSQ_T</code>：宏，定义为1表示arch_type.h中提供类型xwsq_t</li>
<li><code>xwsq_t</code>：类型，无符号顺序值类型</li>
<li><code>ARCH_HAVE_XWSQ_A</code>：宏，定义为1表示arch_type.h中提供类型xwsq_a</li>
<li><code>xwsq_a</code>：类型，原子的无符号顺序值类型</li>
<li><code>ARCH_HAVE_XWSSQ_T</code>：宏，定义为1表示arch_type.h中提供类型xwssq_t</li>
<li><code>xwssq_t</code>：类型，有符号顺序值类型</li>
<li><code>ARCH_HAVE_XWSSQ_A</code>：宏，定义为1表示arch_type.h中提供类型xwssq_a</li>
<li><code>xwssq_a</code>：类型，原子的有符号顺序值类型</li>
<li><code>ARCH_HAVE_XWID_T</code>：宏，定义为1表示arch_type.h中提供类型xwid_t</li>
<li><code>xwid_t</code>：类型，无符号ID值类型</li>
<li><code>ARCH_HAVE_XWID_A</code>：宏，定义为1表示arch_type.h中提供类型xwid_a</li>
<li><code>xwid_a</code>：类型，原子的无符号ID值类型</li>
<li><code>ARCH_HAVE_XWSID_T</code>：宏，定义为1表示arch_type.h中提供类型xwsid_t</li>
<li><code>xwsid_t</code>：类型，有符号ID值类型</li>
<li><code>ARCH_HAVE_XWSID_A</code>：宏，定义为1表示arch_type.h中提供类型xwsid_a</li>
<li><code>xwsid_a</code>：类型，原子的有符号ID值类型</li>
<li><code>ARCH_HAVE_XWER_T</code>：宏，定义为1表示arch_type.h中提供类型xwer_t</li>
<li><code>xwer_t</code>：类型，有符号错误码类型</li>
<li><code>ARCH_HAVE_XWER_A</code>：宏，定义为1表示arch_type.h中提供类型xwer_a</li>
<li><code>xwer_a</code>：类型，原子的有符号错误码类型</li>
<li><code>ARCH_HAVE_XWPR_T</code>：宏，定义为1表示arch_type.h中提供类型xwpr_t</li>
<li><code>xwpr_t</code>：类型，有符号优先级类型</li>
<li><code>ARCH_HAVE_XWPR_A</code>：宏，定义为1表示arch_type.h中提供类型xwpr_a</li>
<li><code>xwpr_a</code>：类型，原子的有符号优先级类型</li>
<li><code>ARCH_HAVE_XWBMP_T</code>：宏，定义为1表示arch_type.h中提供类型xwbmp_t</li>
<li><code>xwbmp_t</code>：类型，无符号位图类型</li>
<li><code>ARCH_HAVE_XWBMP_A</code>：宏，定义为1表示arch_type.h中提供类型xwbmp_a</li>
<li><code>xwbmpy_a</code>：类型，原子的无符号位图类型</li>
<li><code>ARCH_HAVE_XWTM_T</code>：宏，定义为1表示arch_type.h中提供类型xwtm_t</li>
<li><code>xwtm_t</code>：类型，有符号优先级类型</li>
<li><code>ARCH_HAVE_XWTM_A</code>：宏，定义为1表示arch_type.h中提供类型xwtm_a</li>
<li><code>xwtm_a</code>：类型，原子的有符号优先级类型</li>
<li><code>ARCH_HAVE_XWLFQ_T</code>：宏，定义为1表示arch_type.h中提供类型xwlfq_t</li>
<li><code>xwlfq_t</code>：类型，无锁队列类型</li>
<li><code>ARCH_HAVE_XWLFQ_A</code>：宏，定义为1表示arch_type.h中提供类型xwlfq_a</li>
<li><code>xwlfq_a</code>：类型，原子的无锁队列类型</li>
<li><code>ARCH_HAVE_XWISR_F</code>：宏，定义为1表示arch_type.h中提供类型xwisr_f</li>
<li><code>xwer_a</code>：类型，原子的有符号错误码类型</li>
<li><code>ARCH_HAVE_XWIRQ_T</code>：宏，定义为1表示arch_type.h中提供类型xwirq_t</li>
<li><code>xwirq_t</code>：类型，有符号中断号类型</li>
</ul>
</li>
</ul>
<h2 id="32">3.2.编译器</h2>
<ul>
<li>玄武OS头文件：<code>xwos/lib/compiler.h</code>，被<code>xwos/standard.h</code>包含。</li>
<li>Adapter：<code>xwos/ospl/soc/compiler.h</code></li>
<li>Adaptee：<code>xwosimpl_soc_compiler.h</code></li>
<li>内存屏障：玄武OS支持多核系统，多核系统中存在内存数据一致性的问题，
    CPU架构通常会提供内存屏障指令来解决这个问题。移植玄武OS时，需要对这些指令进行封装。<ul>
<li><code>xwccmb()</code>：编译器的内存屏障，防止编译器优化重排代码</li>
<li><code>xwmb_mp_mb()</code>：多核系统的内存屏障</li>
<li><code>xwmb_mp_rmb()</code>：多核系统的读内存屏障</li>
<li><code>xwmb_mp_wmb()</code>：多核系统的写内存屏障</li>
<li><code>xwmb_mp_ddb()</code>：多核系统的数据依赖屏障</li>
<li><code>xwmb_mp_load_acquire()</code>：多核系统的<strong>load-acquire</strong>语义的内存屏障</li>
<li><code>xwmb_mp_store_release()</code>：多核系统的<strong>store-release</strong>语义的内存屏障</li>
</ul>
</li>
</ul>
<pre><code class="Text">题外话：数据依赖屏障

用在存在address dependency的两个读操作之间，和Write barrier/memory barrier
配合使用，确保内存的写操作能够按照程序顺序(Program Order)对这两个读操作可见。例如,

初始条件：A=0; B=1; P=&amp;B;
CPU1: A=8; xwmb_mp_wmb(); P=&amp;A;
CPU2: Q=P; C=*Q;

在CPU2上第二个读*Q，依赖于第一个读P，这被称为address dependency，大部分CPU，例如
X86、ARM都能检测到address dependency，并保证CPU2上Program Order不会发生改变，当
读到C==8时，Q的值一定为&amp;A。但在DEC Alpha上，(Q==&amp;A &amp;&amp; C==1)是有可能出现的，此时需要
使用数据依赖屏障才能得到正确的结果：

CPU2: Q=P; xwmb_mp_ddb(); C=*Q;

数据依赖屏障比较少见，在标准原子操作库(std:atomic/stdatomic.h)中，有一种内存序
release-consume，其中release就是CPU1写内存时的写屏障，
consume就是CPU2上的数据依赖屏障。

除了指针访问数据会产生address dependency，数组下标也会产生address dependency。
</code></pre>

<ul>
<li>编译器相关的宏定义：<ul>
<li><code>__xwcc_section(s)</code>：表明符号属于段s。</li>
<li><code>__xwcc_aligned(x)</code>：表明数据的起始地址对齐到x字节处。</li>
<li><code>__xwcc_inline</code>：表明函数是内联函数，需要和static一起使用。</li>
<li><code>__xwcc_packed</code>：表明数据结构体是紧凑分布的，编译器不要做优化对齐处理。</li>
<li><code>__xwcc_must_check</code>：表明函数返回值必须被读取，否则编译器会报错，若编译器不支持可定义为空宏。</li>
<li><code>__xwcc_unused</code>：表明变量或函数未被使用，用于去除编译警告，若编译器不支持可定义为空。</li>
<li><code>__xwcc_noreturn</code>：表明函数不会返回，若编译器不支持可定义为空。</li>
<li><code>__xwcc_hot</code>：表明函数在代码中经常被调用，若编译器不支持可定义为空。</li>
<li><code>__xwcc_atomic</code>：表明变量是原子的，C11标准中被定义为_Atomic，C99标准中被定义为volatile</li>
<li><code>__xwcc_likely(x)</code>：表明条件x大概率为true，用于编译if..else..的优化，若编译器不支持，
    应该定义为(x)。</li>
<li><code>__xwcc_unlikely(x)</code>：表明条件x大概率为false，用于编译if..else..的优化，若编译器不支持，
    应该定义为(x)。</li>
<li><code>__xwcc_alignl1cache</code>：表明数据的起始地址对齐到1级缓存(way-set缓存)的缓存线</li>
<li><code>__xwcc_alignptr</code>：表明数据的起始地址对齐到指针的尺寸</li>
<li><code>xwcc_offsetof(type, member)</code>：计算member在结构体type中的偏移，等价于标准C库中的offsetof()</li>
</ul>
</li>
</ul>
<h2 id="33">3.3.断点</h2>
<p>许多CPU架构都提供断点指令，以方便调试，玄武OS内核对其进行了统一封装。</p>
<ul>
<li>玄武OS头文件：被包含在<code>xwos/standard.h</code>内。</li>
<li>Adapter：<code>xwos/ospl/soc/bkpt.h</code></li>
<li>Adaptee：<code>xwosimpl_soc_bkpt.h</code></li>
</ul>
<h2 id="34setjmp">3.4.setjmp</h2>
<p>玄武OS的C库中提供了类似于C标准库中的<code>`setjmp()/longjmp()</code>函数组合，
其实现与切换上下文时如何保存寄存器有密切关系。</p>
<ul>
<li>玄武OS头文件：<code>xwos/lib/setjmp.h</code></li>
<li>Adapter：<code>xwos/ospl/soc/setjmp.h</code></li>
<li>Adaptee：<code>xwosimpl_soc_setjmp.h</code></li>
</ul>
<h2 id="35">3.5.系统调用与系统特权</h2>
<p>玄武OS的C库中提供了可切换CPU访问权限的函数。通常CPU都有两种权限模式：用户和系统，
用户模式下某些CPU内的寄存器无法被访问（例如开关中断），
只能通过特殊指令让CPU进入系统模式才可访问。</p>
<ul>
<li>玄武OS头文件：<code>xwos/lib/sc.h</code></li>
<li>Adapter：<code>xwos/ospl/soc/xwsc.h</code></li>
<li>Adaptee：<code>xwosimpl_soc_xwsc.h</code></li>
</ul>
<h2 id="36">3.6.位操作</h2>
<p>玄武OS的C库中提供了位操作的函数集合，为提高效率，部分位操作可使用特殊指令实现。</p>
<ul>
<li>玄武OS头文件：<code>xwos/lib/xwbop.h</code></li>
<li>Adapter：<code>xwos/ospl/soc/xwbop.h</code></li>
<li>Adaptee：<code>xwosimpl_soc_xwbop.h</code></li>
<li>基本类型的位操作函数集合：<ul>
<li>位序镜面翻转：Intel位序（主流的小端CPU都是Inter位序）是越往高位位序号越大，
    摩托罗拉位序（PowerPC架构的CPU）是越往高位位序号越小，
    因此在两个系统混用时需要将数据的位序进行镜面翻转<ul>
<li><code>xwbop_rbit8()</code>：镜面翻转8位数据的位序</li>
<li><code>xwbop_rbit16()</code>：镜面翻转16位数据的位序</li>
<li><code>xwbop_rbit32()</code>：镜面翻转32位数据的位序</li>
<li><code>xwbop_rbit64()</code>：镜面翻转64位数据的位序</li>
</ul>
</li>
<li>大小端反转<ul>
<li><code>xwbop_re16()</code>：反转16位数据的字节序</li>
<li><code>xwbop_re16s32()</code>：反转16位数据的字节序，并将符号位扩展到32位，返回有符号32位数据</li>
<li><code>xwbop_re32()</code>：反转32位数据的字节序</li>
<li><code>xwbop_re32s64()</code>：反转32位数据的字节序，并将符号位扩展到64位，返回有符号64位数据</li>
<li><code>xwbop_re64()</code>：：反转64位数据的字节序</li>
</ul>
</li>
<li>查找被置1的位<ul>
<li><code>xwbop_ffs8()</code>：8位数据，从最低有效位开始查找</li>
<li><code>xwbop_fls8()</code>：8位数据，从最高有效位开始查找</li>
<li><code>xwbop_ffs16()</code>：16位数据，从最低有效位开始查找</li>
<li><code>xwbop_fls16()</code>：16位数据，从最高有效位开始查找</li>
<li><code>xwbop_ffs32()</code>：32位数据，从最低有效位开始查找</li>
<li><code>xwbop_fls32()</code>：32位数据，从最高有效位开始查找</li>
<li><code>xwbop_ffs64()</code>：64位数据，从最低有效位开始查找</li>
<li><code>xwbop_fls64()</code>：64位数据，从最高有效位开始查找</li>
</ul>
</li>
</ul>
</li>
</ul>
<h2 id="37">3.7.原子操作</h2>
<p>玄武OS的C库中提供了原子操作的函数集合，原子操作的实现依赖于CPU的原子操作指令。</p>
<ul>
<li>玄武OS头文件：<ul>
<li><code>xwos/lib/xwaop.h</code>：基本类型原子操作</li>
<li><code>xwos/lib/xwbmpaop.h</code>：位图数组原子操作</li>
</ul>
</li>
<li>Adapter：<ul>
<li><code>xwos/ospl/soc/xwaop8.h</code>：8位原子操作</li>
<li><code>xwos/ospl/soc/xwaop16.h</code>：16位原子操作</li>
<li><code>xwos/ospl/soc/xwaop32.h</code>：32位原子操作</li>
<li><code>xwos/ospl/soc/xwaop64.h</code>：64位原子操作</li>
<li><code>xwos/ospl/soc/xwbmpaop.h</code>：位图数组原子操作</li>
</ul>
</li>
<li>Adaptee：<ul>
<li><code>xwosimpl_soc_xwaop8.h</code>：8位原子操作</li>
<li><code>xwosimpl_soc_xwaop16.h</code>：16位原子操作</li>
<li><code>xwosimpl_soc_xwaop32.h</code>：32位原子操作</li>
<li><code>xwosimpl_soc_xwaop64.h</code>：64位原子操作</li>
<li><code>xwosimpl_soc_xwbmpaop.h</code>：位图数组原子操作</li>
</ul>
</li>
<li>说明<ul>
<li>其他类型的原子操作，玄武OS内核会基于4个基本类型进行封装。
    64位原子操作如果不支持可不提供；</li>
<li>如果CPU架构比较简单，无原子操作指令，可通过关中断实现这些原子操作函数；</li>
<li>某些CPU架构只提供与CPU位宽一致的原子操作指令，考虑代码的通用性，最好只使用
    与CPU位宽一致的原子数据类型；</li>
</ul>
</li>
<li>基本类型的原子操作函数集合：<ul>
<li><code>load()</code>：加载（可指定内存序）</li>
<li><code>store()</code>：存储（可指定内存序）</li>
<li><code>read()</code>：读（内存序：load-require）</li>
<li><code>write()</code>：写（内存序：store-release）</li>
<li><code>add()</code>：加法运算</li>
<li><code>sub()</code>：减法运算</li>
<li><code>rsb()</code>：反向减法运算</li>
<li><code>and()</code>：与运算</li>
<li><code>or()</code>：或运算</li>
<li><code>xor()</code>：异或运算</li>
<li><code>teq_then_write()</code>：测试是否与测试值相等，然后写</li>
<li><code>teq_then_add()</code>：测试是否与测试值相等，然后做加法运算</li>
<li><code>teq_then_sub()</code>：测试是否与测试值相等，然后做减法运算</li>
<li><code>teq_then_rsb()</code>：测试是否与测试值相等，然后做反向减法运算</li>
<li><code>tne_then_write()</code>：测试是否与测试值不相等，然后写</li>
<li><code>tne_then_add()</code>：测试是否与测试值不相等，然后做加法运算</li>
<li><code>tne_then_sub()</code>：测试是否与测试值不相等，然后做减法运算</li>
<li><code>tne_then_rsb()</code>：测试是否与测试值不相等，然后做反向减法运算</li>
<li><code>tge_then_write()</code>：测试是否大于等于测试值，然后写</li>
<li><code>tge_then_add()</code>：测试是否大于等于测试值，然后做加法运算</li>
<li><code>tge_then_sub()</code>：测试是否大于等于测试值，然后做减法运算</li>
<li><code>tge_then_rsb()</code>：测试是否大于等于测试值，然后做反向减法运算</li>
<li><code>tgt_then_write()</code>：测试是否大于测试值，然后写</li>
<li><code>tgt_then_add()</code>：测试是否大于测试值，然后做加法运算</li>
<li><code>tgt_then_sub()</code>：测试是否大于测试值，然后做减法运算</li>
<li><code>tgt_then_rsb()</code>：测试是否大于测试值，然后做反向减法运算</li>
<li><code>tle_then_write()</code>：测试是否小于等于测试值，然后写</li>
<li><code>tle_then_add()</code>：测试是否小于等于测试值，然后做加法运算</li>
<li><code>tle_then_sub()</code>：测试是否小于等于测试值，然后做减法运算</li>
<li><code>tle_then_rsb()</code>：测试是否小于等于测试值，然后做反向减法运算</li>
<li><code>tlt_then_write()</code>：测试是否小于测试值，然后写</li>
<li><code>tlt_then_add()</code>：测试是否小于测试值，然后做加法运算</li>
<li><code>tlt_then_sub()</code>：测试是否小于测试值，然后做减法运算</li>
<li><code>tlt_then_rsb()</code>：测试是否小于测试值，然后做反向减法运算</li>
<li><code>tgele_then_write()</code>：测试是否旧值是否在闭区间[l,r]，然后写</li>
<li><code>tgele_then_add()</code>：测试是否旧值是否在闭区间[l,r]，然后做加法运算</li>
<li><code>tgele_then_sub()</code>：测试是否旧值是否在闭区间[l,r]，然后做减法运算</li>
<li><code>tgele_then_rsb()</code>：测试是否旧值是否在闭区间[l,r]，然后做反向减法运算</li>
<li><code>tgelt_then_write()</code>：测试是否旧值是否在左闭右开区间[l,r)，然后写</li>
<li><code>tgelt_then_add()</code>：测试是否旧值是否在左闭右开区间[l,r)，然后做加法运算</li>
<li><code>tgelt_then_sub()</code>：测试是否旧值是否在左闭右开区间[l,r)，然后做减法运算</li>
<li><code>tgelt_then_rsb()</code>：测试是否旧值是否在左闭右开区间[l,r)，然后做反向减法运算</li>
<li><code>tgtle_then_write()</code>：测试是否旧值是否在左开右闭区间(l,r]，然后写</li>
<li><code>tgtle_then_add()</code>：测试是否旧值是否在左开右闭区间(l,r]，然后做加法运算</li>
<li><code>tgtle_then_sub()</code>：测试是否旧值是否在左开右闭区间(l,r]，然后做减法运算</li>
<li><code>tgtle_then_rsb()</code>：测试是否旧值是否在左开右闭区间(l,r]，然后做反向减法运算</li>
<li><code>tgtlt_then_write()</code>：测试是否旧值是否在开区间(l,r)，然后写</li>
<li><code>tgtlt_then_add()</code>：测试是否旧值是否在开区间(l,r)，然后做加法运算</li>
<li><code>tgtlt_then_sub()</code>：测试是否旧值是否在开区间(l,r)，然后做减法运算</li>
<li><code>tgtlt_then_rsb()</code>：测试是否旧值是否在开区间(l,r)，然后做反向减法运算</li>
<li><code>tst_then_op()</code>：使用tst函数测试，然后使用op函数操作</li>
</ul>
</li>
<li>位图数组的原子操作<ul>
<li><code>c0i()</code>：将第i位清0</li>
<li><code>s1i()</code>：将第i位置1</li>
<li><code>x1i()</code>：翻转第i位</li>
<li><code>t1i()</code>：测试第i位是否为1</li>
<li><code>t0i_then_s1i()</code>：测试第i位是否为0，然后把它置1</li>
<li><code>t1i_then_c0i()</code>：测试第i位是否为1，然后把它清0</li>
<li><code>ffs_then_c0i()</code>：从最低有效位开始查找第一个为1的位并把它清0</li>
<li><code>ffz_then_s1i()</code>：从最低有效位开始查找第一个为0的位并把它置1</li>
<li><code>fls_then_c0i()</code>：从最高有效位开始查找第一个为1的位并把它清0</li>
<li><code>flz_then_s1i()</code>：从最高有效位开始查找第一个为0的位并把它置1</li>
</ul>
</li>
</ul>
<h2 id="38">3.8.无锁队列</h2>
<p>玄武OS的C库中提供了无锁队列的函数，无锁队列的实现依赖于CPU的原子操作指令。</p>
<ul>
<li>玄武OS头文件：<code>xwos/lib/lfq.h</code></li>
<li>Adapter：<code>xwos/ospl/soc/lfq.h</code></li>
<li>Adaptee：<code>xwosimpl_soc_lfq.h</code></li>
</ul>
<h2 id="39">3.9.自旋锁</h2>
<p>在多核系统中，被多个CPU共同访问的内存区域需要被自旋锁保护，自旋锁的实现依赖于
原子操作指令与内存屏障指令。</p>
<ul>
<li>玄武OS头文件：<ul>
<li><code>xwos/osal/lock/spinlock.h</code>：自旋锁</li>
<li><code>xwos/osal/lock/seqlock.h</code>：自旋锁的派生锁，顺序锁</li>
</ul>
</li>
<li>Adapter：<code>xwos/ospl/soc/spinlock.h</code></li>
<li>Adaptee：<code>xwosimpl_soc_spinlock.h</code></li>
</ul>
<h2 id="310">3.10.中断</h2>
<ul>
<li>玄武OS头文件：<code>xwos/osal/irq.h</code></li>
<li>Adapter：<ul>
<li><code>xwos/ospl/irq.h</code>：<strong>定义</strong>了BSP中需要适配的函数；</li>
<li><code>xwos/ospl/soc/irq.h</code>：包含了与SOC相关的一些中断结构体类型的定义。</li>
</ul>
</li>
<li>Adaptee：<ul>
<li><code>xwosimpl_irq.h</code>：<strong>实现</strong>了玄武OS移植层中定义的函数；</li>
<li><code>xwosimpl_soc_irq.h</code>：提供了与SOC相关的一些中断结构体类型的定义。</li>
</ul>
</li>
<li>结构体类型：<ul>
<li><code>struct soc_irq_cfg</code>：每个中断配置，例如优先级等；</li>
<li><code>struct soc_irq_data</code>：每个中断的数据（中断处理函数的参数）。</li>
</ul>
</li>
<li>结构体：<ul>
<li><code>xwospl_ivt</code>：中断向量表，由于每个电路板的中断情况不一样，因此此结构体
                      通常定义在<strong>电路板描述层(BDL)</strong>；</li>
<li><code>xwospl_idvt</code>：中断参数表，由于每个电路板的中断情况不一样，因此
                       此结构体通常定义在<strong>电路板描述层(BDL)</strong>。</li>
</ul>
</li>
<li>中断号：<ul>
<li>玄武OS定义了中断号类型<code>xwirq_t</code>，是一个有符号数：<ul>
<li>整数和0：表示SOC的外设中断，外设中断通常可以配置与CPU的“亲合力”；</li>
<li>负数：表示异常，异常通常是每个都有的CPU私有中断。</li>
</ul>
</li>
</ul>
</li>
<li>中断优先级</li>
</ul>
<pre><code>切换上下文的中断 &lt;= 滴答定时器的中断 &lt; 调度器服务中断
切换上下文的中断 &lt; 其他中断 &lt; 调度器服务中断
</code></pre>

<ul>
<li>操作系统移植层中需要提供的函数：<ul>
<li><code>xwospl_cpuirq_enable_lc()</code>：打开当前CPU的中断开关</li>
<li><code>xwospl_cpuirq_disable_lc()</code>：关闭当前CPU的中断开关</li>
<li><code>xwospl_cpuirq_restore_lc()</code>：恢复当前CPU的中断开关</li>
<li><code>xwospl_cpuirq_save_lc()</code>：存储当前CPU的中断开关标志，然后关闭</li>
<li><code>xwospl_irq_get_id()</code>：获取当前中断的中断号</li>
<li><code>xwospl_irq_request()</code>：申请中断</li>
<li><code>xwospl_irq_release()</code>：释放中断</li>
<li><code>xwospl_irq_enable()</code>：开启中断</li>
<li><code>xwospl_irq_disable()</code>：关闭中断</li>
<li><code>xwospl_irq_save()</code>：保存中断开关标志并关闭中断</li>
<li><code>xwospl_irq_restore()</code>：恢复中断开关标志</li>
<li><code>xwospl_irq_pend()</code>：挂起中断标志</li>
<li><code>xwospl_irq_clear()</code>：清除中断标志</li>
<li><code>xwospl_irq_cfg()</code>：配置中断</li>
<li><code>xwospl_irq_get_cfg();</code>：获取中断配置</li>
<li><code>xwospl_irq_get_data()</code>：获取中断数据</li>
</ul>
</li>
</ul>
<h2 id="311">3.11.硬件定时器</h2>
<p>每个CPU都需要一个私有的硬件定时器提供滴答中断，玄武OS的调度、超时、软件定时器都
基于滴答中断来实现。</p>
<ul>
<li>Adapter：<code>xwos/ospl/syshwt.h</code></li>
<li>Adaptee：<code>xwosimpl_syshwt.h</code></li>
<li>适配函数：<ul>
<li><code>xwospl_syshwt_init()</code>：初始化硬件定时器</li>
<li><code>xwospl_syshwt_start()</code>：启动硬件定时器</li>
<li><code>xwospl_syshwt_stop()</code>：关闭硬件定时器</li>
<li><code>xwospl_syshwt_get_timeconfetti()</code>：返回还有多少纳秒进入下一次定时器中断</li>
</ul>
</li>
</ul>
<h2 id="312">3.12.调度器</h2>
<ul>
<li>Adapter：<code>xwos/ospl/skd.h</code></li>
<li>Adaptee：<code>xwosimpl_skd.h</code></li>
<li>适配函数：<ul>
<li><code>xwospl_skd_init()</code>：初始化调度调度器，一般用于初始化调度相关的中断</li>
<li><code>xwospl_skd_init_stack()</code>：初始化调度对象的栈</li>
<li><code>xwospl_skd_get_id()</code>：获取当前CPU的ID</li>
<li><code>xwospl_skd_start_lc()</code>：启动调度器</li>
<li><code>xwospl_skd_suspend()</code>：暂停调度器，用于电源管理</li>
<li><code>xwospl_skd_resume()</code>：继续调度器，用于电源管理</li>
<li><code>xwospl_thrd_exit_lc()</code>：本地CPU上的线程退出</li>
<li><code>xwospl_thrd_freeze_lc()</code>：冻结本地CPU中正在运行的线程</li>
<li><code>xwospl_thrd_outmigrate()</code>：将线程迁出其他CPU，并准备迁入其他CPU（仅限多核）</li>
<li><code>xwospl_thrd_immigrate()</code>：迁移线程至目标CPU（仅限多核）</li>
</ul>
</li>
</ul>
<h1 id="4">4.链接脚本</h1>
<p>SOC描述层中包含了SOC的基本链接脚本，使用时需要在电路板目录的<code>cfg</code>文件夹中定义
一个<code>XuanWuOS.lds</code>，其中包含了SOC的地址空间的定义，然后再<code>include</code>SOC描述层
中的连接脚本即可。例如：<code>xwbd/WeActH750/cfg/XuanWuOS.lds</code>中只定义了<code>MEMORY</code>，
然后<code>include xwcd/soc/arm/v7m/gcc/m7/stm32/h7.lds</code>。</p>
<ul>
<li>玄武OS定义了一些<strong>段(section)</strong>，链接时，可将内核代码、内核数据放在镜像文件的
    特定区域。这需要在<strong>链接脚本</strong>中指明这些<strong>段</strong>如何存放。<ul>
<li><code>__xwos_init_code</code>：初始化代码，存放在<strong>.xwos.init.text</strong>段</li>
<li><code>__xwos_init_rodata</code>：初始化阶段的const数据，存放在<strong>.xwos.init.rodata</strong>段</li>
<li><code>__xwos_exit_code</code>：退出代码，存放在<strong>.xwos.exit.text</strong>段</li>
<li><code>__xwos_exit_rodata</code>：退出阶段的const数据，存放在<strong>.xwos.exit.rodata</strong>段</li>
<li><code>__xwos_ivt</code>：中断向量表，存放在<strong>.xwos.ivt</strong>段</li>
<li><code>__xwos_isr</code>：中断代码，存放在<strong>.xwos.isr.text</strong>段</li>
<li><code>__xwos_bh</code>：中断底半部代码，存放在<strong>.xwos.isr.text</strong>段</li>
<li><code>__xwos_code</code>：玄武OS内核代码，存放在<strong>.xwos.text</strong>段</li>
<li><code>__xwos_api</code>：玄武OS内核API，存放在<strong>.xwos.text</strong>段</li>
<li><code>__xwos_rodata</code>：const数据，存放在<strong>.xwos.rodata</strong>段</li>
<li><code>__xwos_data</code>：全局变量与静态变量，存放在<strong>.xwos.data</strong>段</li>
</ul>
</li>
<li>如果不需要这些自定义的<strong>段</strong>，可将上面的宏定义为<strong>空</strong>，相应的，代码会默认
    放在<code>.text</code>段，数据会默认放在<code>.data</code>段，const数据会默认放在<code>.rodata</code>段。
    这三个<strong>段</strong>都是由编译器默认产生的。</li>
<li>当<code>__xwos_data</code>定义为<strong>空</strong>时，配置文件<code>cfg/xwos.h</code>中的
    配置<code>XWKNCFG_RELOCATE_DATA</code>也应该不定义或定义为0。</li>
</ul>
<h1 id="5">5.初始化流程</h1>
<p>玄武OS提供了一个通用的<a href="../../UserManual/04-Boot-Flow/">启动流程</a>：</p>
<p><img alt="img" src="../../UserManual/res/figure/boot-flow.png" title="玄武OS启动流程" /></p>
<ul>
<li>用户可在流程中找地方插入SOC的初始化的代码，但要注意：<ul>
<li><strong>lowlevel_init</strong>的流程中不可访问全局变量，因为还未将全局变量的初值从
    flash中拷贝到RAM中；</li>
<li><strong>cxx_init</strong>之后才可开始调用C++的代码；</li>
</ul>
</li>
<li>玄武OS的初始化流程中，在<code>soc_init()</code>中完成对中断控制器、调度器的初始化，
    如果用户不使用玄武OS的初始化流程，需要依次调用：<ul>
<li><code>xwos_init()</code>：初始化玄武OS内核；</li>
<li>多核系统：<ul>
<li><code>xwmp_irqc_construct()</code>：初始化每个CPU的中断控制器；</li>
<li><code>xwmp_irqc_register()</code>：将每个CPU的中断控制器注册到中断控制子系统；</li>
<li><code>xwmp_skd_init_lc()</code>：分别在每个CPU上都运行一次这个函数初始化自己的调度器；</li>
</ul>
</li>
<li>单核系统：<ul>
<li><code>xwup_irqc_init()</code>：初始化中断控制器；</li>
<li><code>xwup_skd_init_lc()</code>：初始化调度器；</li>
</ul>
</li>
</ul>
</li>
</ul>
<h1 id="6">6.编译集成环境</h1>
<p>玄武OS提供了一个<a href="../../UserManual/03-Build-System/">构建系统</a>，可在Windows、Linux、MacOS上运行。
用户可以选择使用玄武OS的编译集成环境，也可以使用其他IDE进行编译。</p>
<h2 id="61">6.1.使用玄武构建系统</h2>
<ul>
<li>玄武OS的构建系统在构建<strong>内核</strong>、<strong>xwmd</strong>模块、<strong>xwcd</strong>模块、<strong>xwem</strong>模块、
    <strong>xwam</strong>模块、<strong>oem</strong>模块时都是独立编译成静态库<strong>.a</strong>，然后再链接。
    各个模块的编译配置（头文件、编译器选项）都是完全独立的，可以理解为不同的子工程。</li>
<li>构建是从<code>xwbd/电路板名称/</code>录下执行命令<code>make</code>开始的。</li>
</ul>
<h2 id="62ide">6.2.使用其他IDE构建系统</h2>
<ul>
<li>需要增加的头文件搜索路径：<ul>
<li>XuanWuOS根目录<code>XuanWuOS</code></li>
<li>架构描述层(ADL)目录：以ARMv7m为例，<code>xwcd/soc/arm/v7m/gcc</code></li>
<li>CPU描述层(CDL)目录：以ARMv7m7为例，<code>xwcd/soc/arm/v7m/gcc/m7</code></li>
<li>SOC描述层(SDL)目录：以STM32H7为例，<code>xwcd/soc/arm/v7m/gcc/m7/stm32h7x</code></li>
<li>电路板目录：以开发板WeActH750为例，<code>xwbd/WeActH750</code></li>
</ul>
</li>
<li>需要包含的源码文件：<ul>
<li>内核目录<code>xwos</code></li>
<li>架构描述层(ADL)目录：以ARMv7m为例，<code>xwcd/soc/arm/v7m/gcc</code></li>
<li>CPU描述层(CDL)目录：以ARMv7m7为例，<code>xwcd/soc/arm/v7m/gcc/m7</code></li>
<li>SOC描述层(SDL)目录：以STM32H7为例，<code>xwcd/soc/arm/v7m/gcc/m7/stm32h7x</code></li>
<li>电路板目录：以开发板WeActH750为例，<code>xwbd/WeActH750</code></li>
<li>中间件<code>xwmd</code>、驱动框架<code>xwcd/ds</code>、第三方模块<code>xwem</code>、应用模块<code>xwam</code>
    不是必须的，若只使用玄武OS内核，这些可以删除。</li>
</ul>
</li>
<li>若其他IDE的工具链不是gcc，则需要重新实现ADL、CDL、SDL中的代码，
    此种情况<code>xwcd/soc</code>中的代码也不需要。</li>
<li>需要修改配置，以开发板WeActH750为例，<code>xwbd/WeActH750/cfg</code>。</li>
<li>需要在<code>xwbd/WeActH750</code>目录，执行一次<code>make cfg</code>，生成
    然后将<code>xwbd/WeActH750/wkspc/autogen.h</code>拷贝到<code>xwbd/WeActH750/cfg</code>中。</li>
<li>需要配置IDE的连接脚本。</li>
</ul>
<h1 id="7">7.附录</h1>
<ul>
<li><a href="../00-Index/">返回目录</a></li>
</ul></div>
            </div>
        </div>

        <footer class="col-md-12">
            <hr>
            <p>Documentation built with <a href="https://www.mkdocs.org/">MkDocs</a>.</p>
        </footer>
        <script>
            var base_url = "../..",
                shortcuts = {"help": 191, "next": 78, "previous": 80, "search": 83};
        </script>
        <script src="../../js/base.js" defer></script>
        <script src="../../search/main.js" defer></script>

        <div class="modal" id="mkdocs_search_modal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel" aria-hidden="true">
    <div class="modal-dialog modal-lg">
        <div class="modal-content">
            <div class="modal-header">
                <h4 class="modal-title" id="searchModalLabel">搜索</h4>
                <button type="button" class="close" data-dismiss="modal"><span aria-hidden="true">&times;</span><span class="sr-only">Close</span></button>
            </div>
            <div class="modal-body">
                <p>
                    在这里所有文档：
                </p>
                <form>
                    <div class="form-group">
                        <input type="search" class="form-control" placeholder="搜索..." id="mkdocs-search-query" title="Type search term here">
                    </div>
                </form>
                <div id="mkdocs-search-results"></div>
            </div>
            <div class="modal-footer">
            </div>
        </div>
    </div>
</div><div class="modal" id="mkdocs_keyboard_modal" tabindex="-1" role="dialog" aria-labelledby="keyboardModalLabel" aria-hidden="true">
    <div class="modal-dialog">
        <div class="modal-content">
            <div class="modal-header">
                <h4 class="modal-title" id="keyboardModalLabel">Keyboard Shortcuts</h4>
                <button type="button" class="close" data-dismiss="modal"><span aria-hidden="true">&times;</span><span class="sr-only">Close</span></button>
            </div>
            <div class="modal-body">
              <table class="table">
                <thead>
                  <tr>
                    <th style="width: 20%;">Keys</th>
                    <th>Action</th>
                  </tr>
                </thead>
                <tbody>
                  <tr>
                    <td class="help shortcut"><kbd>?</kbd></td>
                    <td>Open this help</td>
                  </tr>
                  <tr>
                    <td class="next shortcut"><kbd>n</kbd></td>
                    <td>Next page</td>
                  </tr>
                  <tr>
                    <td class="prev shortcut"><kbd>p</kbd></td>
                    <td>Previous page</td>
                  </tr>
                  <tr>
                    <td class="search shortcut"><kbd>s</kbd></td>
                    <td>Search</td>
                  </tr>
                </tbody>
              </table>
            </div>
            <div class="modal-footer">
            </div>
        </div>
    </div>
</div>

    </body>
</html>
